package com.qf.java2201.securitydemo1.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

/**
 * @date 2022/5/16
 * @desc
 */
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //用于密码的密文处理
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        //生成密文
        String password = passwordEncoder.encode("123456");
        //设置用户名和密码
        auth.inMemoryAuthentication().withUser("qfAdmin").password(password).roles("admin");
    }

    @Autowired
    private UserDetailsService userDetailsService;


    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }



    @Override
    protected void configure(HttpSecurity http) throws Exception {

        //注销的配置
        http.logout().logoutUrl("/logout") //注销时访问的路径
                .logoutSuccessUrl("/login.html").permitAll(); //注销成功后访问的路径


        http.formLogin()
                .loginPage("/login.html") //设置自定义登陆页面 注意如果不通过controller 跳转这个页面需要放在static中
                .loginProcessingUrl("/user/login") //登陆时访问的路径 也就s  这个路径表示表单提交  处理登录请求的controller 不需要我们写  security 帮我们做到了
                .defaultSuccessUrl("/main").permitAll() //登陆成功后跳转的路径
                .and().authorizeRequests()
                .antMatchers("/","/add","/user/login").permitAll() //设置可以直接访问的路径，取消拦截
                //.antMatchers("/user/admin").hasAuthority("menu:system") // 有menu:system 这个权限 才可以访问这个路径
                //.antMatchers("/user/admin").hasAnyAuthority("menu:system","xxx") // 有admin 这个权限 才可以访问这个路径
                //.antMatchers("/user/admin").hasRole("管理员") // 有 管理员 这个角色 才可以访问这个路径
                .antMatchers("/user/admin").hasAnyRole("管理员","普通用户") // 有  管理员 普通用户 任意角色  都可以访问这个路径
                .anyRequest().authenticated()  // 其他请求 需要认证
                .and().csrf().disable(); //关闭csrf防护

        http.exceptionHandling().accessDeniedPage("/unauth");
    }



    @Bean
    PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
}
